const { Service } = require("egg");

class HomeService extends Service {
    /**
     * 登录接口
     * @param {string} name 角色名称
     */
    async login({ username, password }) {
        // 查找用户是否存在
        const user = await this.service.user.findByUsername(username);
        // 不存在该用户
        if (!user) {
            this.ctx.cast(404, "用户不存在");
        }
        // 检查密码是否匹配
        if (user.password !== this.ctx.helper.encrypt(password)) {
            this.ctx.cast(400, "用户密码不匹配");
        }
        // 查找该用户的角色信息
        const roles = await this.service.role.readByUid(user.id);
        if (roles.length === 0) {
            this.ctx.cast(404, "用户身份无法确认");
        }
        // 用户信息
        const profile = {
            uid: user.id,
            username: user.username,
            nickname: user.nickname,
            roles,
        };
        // 生成 token
        const token = this.ctx.helper.genToken(profile);
        // 查找所有权限
        const acls = await this.service.acl.readByUid(user.id);
        // 返回响应
        return {
            token,
            profile,
            acls: acls.map((acl) => acl.id),
        };
    }

    /**
     * 添加角色
     * @param {object} role 角色信息
     */
    async add({ name }) {
        // 查看是否存在
        const role = await this.findByName(name);
        if (role) this.ctx.cast(403, "角色已存在");
        // 保存到数据库
        let sql = "insert into role (id, name) values (?, ?)";
        let params = [this.ctx.helper.uuid(), name];
        let res = await this.app.mysql.query(sql, params);
        return {
            row: res.affectedRows,
            id: res.insertId,
        };
    }
}

module.exports = HomeService;
